package org.example.projectdemo.service;

import org.example.projectdemo.model.entity.Course;
import org.example.projectdemo.model.entity.Schedule;
import org.example.projectdemo.repository.AttendanceRepository;
import org.example.projectdemo.repository.CourseRepository;
import org.example.projectdemo.repository.ScheduleRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;

/**
 * ClassName: CourseService
 * Package: org.example.projectdemo.service.impl
 * Description:
 *
 * @Author ZY
 * @Create 23:08
 * @Version 1.0
 */
@Service
public class CourseService {
    @Autowired
    private CourseRepository courseRepository;
    
    @Autowired
    private ScheduleRepository scheduleRepository;

    @Autowired
    private AttendanceRepository attendanceRepository;

    // 创建课程
    public Course createCourse(Course course) {
        // 确保ID为null以创建新记录
        course.setId(null);
        // 检查时间冲突
        checkCourseConflict(course);
        return courseRepository.save(course);
    }

    // 更新课程
    public Course updateCourse(Course course) {
        // 确保ID存在以更新记录
        if (course.getId() == null || !courseRepository.existsById(course.getId())) {
            throw new IllegalArgumentException("课程ID不存在，无法更新");
        }
        // 检查时间冲突
        checkCourseConflict(course);
        return courseRepository.save(course);
    }

    // 根据ID查找课程
    public Optional<Course> getCourseById(Long id) {
        return courseRepository.findById(id);
    }

    // 检查课程是否存在
    public boolean existsCourseById(Long id) {
        return courseRepository.existsById(id);
    }

    // 查找所有课程
    public List<Course> getAllCourses() {
        return courseRepository.findAll();
    }

    // 根据课程代码查找课程
    public Optional<Course> getCourseByCode(String courseCode) {
        return courseRepository.findByCourseCode(courseCode);
    }

    // 根据教师姓名查找课程
    public List<Course> getCoursesByTeacherName(String teacherName) {
        return courseRepository.findByTeacherName(teacherName);
    }

    // 根据星期几查找课程
    public List<Course> getCoursesByDayOfWeek(Byte dayOfWeek) {
        return courseRepository.findByDayOfWeek(dayOfWeek);
    }

    // 根据状态查找课程（如active, inactive）
    public List<Course> getCoursesByState(String state) {
        return courseRepository.findByCourseState(state);
    }

    // 删除课程
    @Transactional
    public void deleteCourse(Long id) {
        try {
            // 检查课程是否存在
            if (!courseRepository.existsById(id)) {
                throw new IllegalArgumentException("课程不存在");
            }

            // 获取所有相关的排课记录
            List<Schedule> schedules = scheduleRepository.findByCourseId(id);

            // 先删除与这些排课相关的所有考勤记录
            System.out.println("删除课程相关的考勤记录，课程ID: " + id);
            for (Schedule schedule : schedules) {
                attendanceRepository.deleteByScheduleId(schedule.getId());
            }

            // 再删除相关的排课记录（避免外键约束问题）
            System.out.println("删除课程相关的排课记录，课程ID: " + id);
            scheduleRepository.deleteByCourseId(id);

            // 然后删除课程
            System.out.println("删除课程，ID: " + id);
            courseRepository.deleteById(id);

            System.out.println("课程删除完成，ID: " + id);
        } catch (Exception e) {
            // 记录详细错误信息
            System.err.println("删除课程失败，ID: " + id + ", 错误: " + e.getMessage());
            e.printStackTrace();
            throw new RuntimeException("删除课程失败: " + e.getMessage(), e);
        }
    }
    
    // 检查课程时间冲突
    private void checkCourseConflict(Course course) {
        List<Course> courses = courseRepository.findByDayOfWeek(course.getDayOfWeek());
        
        for (Course existingCourse : courses) {
            // 如果是更新操作，跳过自己
            if (existingCourse.getId() != null && existingCourse.getId().equals(course.getId())) {
                continue;
            }
            
            // 检查教室是否相同
            if (existingCourse.getClassroom().equals(course.getClassroom())) {
                // 检查时间是否冲突
                if (!(course.getEndTime().isBefore(existingCourse.getStartTime()) || 
                      course.getStartTime().isAfter(existingCourse.getEndTime()))) {
                    throw new IllegalArgumentException(
                        String.format("课程时间冲突：星期%d %s 教室 %s 已被 %s 占用，时间范围：%s-%s", 
                                     course.getDayOfWeek(), 
                                     course.getClassroom(),
                                     existingCourse.getCourseName(),
                                     existingCourse.getStartTime(), 
                                     existingCourse.getEndTime()));
                }
            }
        }
    }
}